IB/FB SP nevraci vysledek?
Otázka od: Jaroslav Uher
8. 9. 2002 3:44
Ahoj,
D6P, Win2000, FB 1
mam SP, ktera hromadne updatuje hodnotu jednoho pole
SET TERM !! ;
/* procedura zmeni hodnotu DEL 'posle do archivu' nebo
'z archivu' vsechny pripady
N/P starsi nez zadane datum
a vrati pocet takto 'presunutych'
*/
CREATE PROCEDURE PRIPADY_TO_ARCHIV (
U_NP SMALLINT,
U_DT_VZNIKU DATE,
U_DEL SMALLINT,
U_NEWDEL SMALLINT,
U_LAST_USER CHAR(4))
RETURNS (POCET INTEGER)
AS
DECLARE VARIABLE S_ID INTEGER;
BEGIN
POCET = 0;
BEGIN
FOR SELECT ID FROM PRIPADY
WHERE (NP = :U_NP) AND (DEL = :U_DEL) AND (DT_VZNIKU < :U_DT_VZNIKU)
INTO :S_ID
DO
BEGIN
UPDATE PRIPADY
SET DEL = :U_NEWDEL, LAST_USER = :U_LAST_USER,
LAST_UPDATE = 'NOW'
WHERE ID = :S_ID;
END
POCET = POCET +1;
SUSPEND;
END
END !!
SET TERM ; !!
COMMIT;
zda se, ze vse funguje OK, ale nejak mi (asi) nevraci POCET nebo jej nedokazu
odchytit.
Na klientovi je toto:
...
with IBStoredProc.Params.CreateParam(ftString, 'LAST_USER',ptInput) do
AsString := xxx;
IBStoredProc.Prepare;
IBStoredProc.ExecProc;
Pocet := IBStoredProc.Params.CreateParam(ftInteger,
'POCET',ptOutput).AsInteger;
// POCET je porad 0, i kdyz update se provede na x zaznamech
IBTransaction1.CommitRetaining;
MessageDlg(Format(rsM_NumberPripaduMoved, [Pocet]), mtInformation, [mbYes],0)
Muze mi, prosim nekdo poradit, kde delam chybu ?
Dekuji a preji hezky den,
Jarek Uher
Odpovedá: Jan Sebelík
8. 9. 2002 18:02
Ja teda nevim, ale jsou mi tam divne tri veci:
1.
Ten SUSPEND je tam podle me zbytecny.
Pokud je mi znamo, tak SUSPEND se pouziva tehdy, kdyz ma procedura vracet
tabulku hodnot, na klientovi pak "select * from proc(x,y,z)". Jinak potreba
neni.
2.
Pokud dobre koukam, tak ten POCET=POCET+1 neni uvnitr cyklu FOR SELECT, ale az
za nim.
3.
Jestlize TIBStoredProc priradim jmeno (a asi prepare), tak by si parametry mela
vytvorit sama.
Ja jenom zadam vstupni:
IBStoredProc.Params.ByName(...).asString:=...;
udelam
IBStoredProc.Execute;
a prectu vystupni
....:=IBStoredProc.Params.ByName(...).asInteger;
Pisu to z hlavy, takze je to mozna malinko jinak.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
----------
> Odesílatel: Jaroslav Uher <moravia@mbox.vol.cz>
> Komu: delphi-l@clexpert.cz
> Předmět: IB/FB SP nevraci vysledek?
> Datum: 6. září 2002 14:23
>
> Ahoj,
>
> D6P, Win2000, FB 1
> mam SP, ktera hromadne updatuje hodnotu jednoho pole
>
> SET TERM !! ;
>
> /* procedura zmeni hodnotu DEL 'posle do archivu' nebo
> 'z archivu' vsechny pripady
> N/P starsi nez zadane datum
> a vrati pocet takto 'presunutych'
> */
>
> CREATE PROCEDURE PRIPADY_TO_ARCHIV (
> U_NP SMALLINT,
> U_DT_VZNIKU DATE,
> U_DEL SMALLINT,
> U_NEWDEL SMALLINT,
> U_LAST_USER CHAR(4))
> RETURNS (POCET INTEGER)
> AS
> DECLARE VARIABLE S_ID INTEGER;
> BEGIN
> POCET = 0;
> BEGIN
> FOR SELECT ID FROM PRIPADY
> WHERE (NP = :U_NP) AND (DEL = :U_DEL) AND (DT_VZNIKU < :U_DT_VZNIKU)
> INTO :S_ID
> DO
> BEGIN
> UPDATE PRIPADY
> SET DEL = :U_NEWDEL, LAST_USER = :U_LAST_USER,
> LAST_UPDATE = 'NOW'
> WHERE ID = :S_ID;
> END
> POCET = POCET +1;
> SUSPEND;
> END
> END !!
> SET TERM ; !!
>
> COMMIT;
>
> zda se, ze vse funguje OK, ale nejak mi (asi) nevraci POCET nebo jej nedokazu
> odchytit.
> Na klientovi je toto:
>
> ...
> with IBStoredProc.Params.CreateParam(ftString, 'LAST_USER',ptInput) do
> AsString := xxx;
>
> IBStoredProc.Prepare;
> IBStoredProc.ExecProc;
>
> Pocet := IBStoredProc.Params.CreateParam(ftInteger,
'POCET',ptOutput).AsInteger;
> // POCET je porad 0, i kdyz update se provede na x zaznamech
>
> IBTransaction1.CommitRetaining;
>
> MessageDlg(Format(rsM_NumberPripaduMoved, [Pocet]), mtInformation,
[mbYes],0)
>
>
> Muze mi, prosim nekdo poradit, kde delam chybu ?
>
> Dekuji a preji hezky den,
>
> Jarek Uher
Odpovedá: Kalhous Zdenek
9. 9. 2002 9:00
On 6 Sep 2002 at 14:23, Jaroslav Uher wrote:
> IBStoredProc.Prepare;
> IBStoredProc.ExecProc;
> Pocet := IBStoredProc.Params.CreateParam(ftInteger,
> 'POCET',ptOutput).AsInteger;
> // POCET je porad 0, i kdyz update se provede na x zaznamech
Vraceni vysledku procedury do delphi je podivna vec. IBStoredProc
nepouzivam ale kdyz udelate treba pres IBSQL
SELECT POCET from jmeno_procedury
tak tahle procedura vrati radu cisel od 1 do x. Aby delala to co
chcete, je potreba suspend dat az za cykl FOR SELECT. Potom
tento SELECT vrati jediny radek a bude to POCET=x.